/**
 * 工厂方法模式
 */

//  为了解决简单工厂模式的这两个弊端，工厂方法模式应运而生，它规定每个产品都有一个专属工厂。比如苹果有专属的苹果工厂，梨子有专属的梨子工厂
import { Apple, AppleSeed, Pear, Sunlight, Water } from './simpleFactory';
// 苹果工厂
class AppleFactory {
    create() {
        const appleSeed = new AppleSeed();
        const sunlight = new Sunlight();
        const water = new Water();
        return new Apple(appleSeed, sunlight, water);
    }
}

// 梨子工厂
class PearFactory {
    create() {
        return new Pear();
    }
}
const appleFactory = new AppleFactory();
const apple = appleFactory.create();
const pearFactory = new PearFactory();
const pear = pearFactory.create();

// 当生产的产品种类越来越多时，工厂类不会变成超级类。工厂类会越来越多，保持灵活。不会越来越大、变得臃肿。
//       如果苹果的生产过程需要修改时，只需修改苹果工厂。梨子的生产过程需要修改时，只需修改梨子工厂。符合单一职责原则。
// 当需要生产新的产品时，无需更改既有的工厂，只需要添加新的工厂即可。保持了面向对象的可扩展性，符合开闭原则。
